#include "UdpClient.hpp"
#include "Common.hpp"
#include<iostream>
#include<string>
#include<cstring>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>

#include <arpa/inet.h>
int main(int argc,char* argv[])
{
    if(argc!=3)
    {
        std::cerr<<"Usage: "<<argv[0]<<" serverip serverport"<<std::endl;
        Die(USAGE_ERR);
    }

    std::string serverip=argv[1];
    uint16_t serverport=std::stoi(argv[2]);
    //创建socket文件
    int sockfd=::socket(AF_INET,SOCK_DGRAM,0);//lpv4套接字类型  udp协议

    struct sockaddr_in server;
    memset(&server,0,sizeof(server));
    server.sin_family=AF_INET;
    server.sin_addr.s_addr=::inet_addr(serverip.c_str());
    server.sin_port=::htons(serverport);
     //现在有一个文件但未绑定和一个服务器的sockaddr_in
    while(true)
    {
        std::cout<<"Please Enter# ";
        std::string message;
        //string库的普通函数
        std::getline(std::cin,message);
        //给谁发啊
        ::sendto(sockfd,message.c_str(),message.size(),0,CONV(&server),sizeof(server));//客户端无需手动绑定，第一次发送会自动绑定端口号
        //给服务端发送消息后，服务端会echo给用户端，那用户端就把echo的内容打一下
        char buffer[1024];
        struct sockaddr_in tmp;
        socklen_t sz=sizeof(tmp);
        //已经自动绑定端口号了，recvfrom是一个返回型参数，可以得到谁发的信息
        int n=::recvfrom(sockfd,buffer,sizeof(buffer)-1,0,CONV(&tmp),&sz);
        if(n > 0)
        {
            buffer[n]=0;
            std::cout<<buffer<<std::endl;

        }
    }
    return 0;


}